import { fileURLToPath, URL } from "node:url";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import AutoImport from 'unplugin-auto-import/vite';
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
import dts from 'vite-plugin-dts';
import federation from '@originjs/vite-plugin-federation';

export default defineConfig({
  plugins: [
    vue(),
    dts({
      include: ['src/**/*.ts', 'src/**/*.d.ts', 'src/**/*.vue'], // 必须包含源码文件
      outDir: 'dist', // 输出目录（默认即 dist）
      staticImport: true, // 推荐启用
      insertTypesEntry: true, // 自动生成类型入口
      // 清理输出目录，避免旧文件残留
      cleanVueFileName: true,
      copyDtsFiles: true,
    }),
    createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [path.resolve(process.cwd(), "src/assets/svg")],
      // 指定symbolId格式
      symbolId: "i-[dir]-[name]"
    }),
    AutoImport({
      resolvers:
        [
          IconsResolver({
            prefix: "Icon"
          }),
          ElementPlusResolver()],
    }),
    Components({
      resolvers: [
        IconsResolver({
          enabledCollections: ["ep"]
        }),
        ElementPlusResolver()
      ],
    }),
    Icons({
      autoInstall: true,
      compiler: "vue3"
    }),
    federation({
      name: 'module-login',       // 插件标识名（可任意，但建议唯一）
      filename: 'remoteEntry.js', // 固定文件名
      exposes: {                  // 暴露给外部的模块
        './LoginModule': './src/components/index.vue' // 暴露路径
      },
      shared: ['vue']             // 共享依赖
    }),
  ],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url))
    },
  },
  server: {
    port: 3001,
  },
  build: {
    // outDir: path.resolve(__dirname, '../mctp-modules/mctp-modules-template/src/dist'),
    outDir: path.resolve(__dirname, './dist'),
    lib: {
      entry: path.resolve(__dirname, 'src/index.ts'), // 改为组件汇总入口
      name: 'MyModules',
      fileName: (format) => `mctp-plat.${format}.js`, // 输出文件名
      formats: ['es'] // 仅 ES 模块
    },
    rollupOptions: {
      external: ['vue'],               // 空数组表示不外部化任何依赖（全部打包）
      output: {
        // 如果依赖需要全局变量（可选）
        globals: {},
        manualChunks: undefined,
        exports: 'named',
        // 确保模块导出规范
        interop: 'auto',
        // 保留模块结构
        preserveModules: false,
      }
    },
    // 优化构建输出
    minify: true,
    sourcemap: true,
  },
});